Software programs can be tested in various ways. Under beta testing, for example, a program is distributed to beta users who exercise the program and report errors they find. However, use by even a large number of beta users will not necessarily disclose a majority of the errors in a program, because beta testing does not systematically exercise the various aspects of a given program. Script automation systems test programs by running scripts. Test scripts can be hand-crafted by directly typing them in, or by recording tester actions, for example. Programs can also be tested by being exercised directly by a tester or a developer. However, the tester or developer may be focused on a particular feature of a program, or may be focused on program actions that are meant to accomplish a particular user task, so test coverage may be limited. Program testing can be both labor intensive and incomplete. Some testing approaches rely on hand-crafted (manually created) tests, which do not necessarily provide broad coverage of all program features, and which may be difficult to adapt as the program changes.